/**
 * Copyright &copy; 2013-2015 山东易科德软件有限公司 All rights reserved.
 */
package cn.net.ecode.modules.sys.service;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.net.ecode.common.config.Global;
import cn.net.ecode.common.service.TreeService;
import cn.net.ecode.modules.sys.dao.OfficeDao;
import cn.net.ecode.modules.sys.entity.Office;
import cn.net.ecode.modules.sys.utils.DataScopeUtils;
import cn.net.ecode.modules.sys.utils.UserUtils;

/**
 * 机构Service
 * @author ThinkGem
 * @version 2014-8-19
 */
@Service
@Transactional(readOnly = true)
public class OfficeService extends TreeService<OfficeDao, Office> {

	public Office get(String officeCode) {
		return super.get(officeCode);
	}

	/**
	 * 查询组织机构列表
	 */
	@Transactional(readOnly = true)
	public List<Office> findList(Office office) {
		// 生成数据权限过滤条件
		//DataScopeUtils.genSql(office, "dsf", "office_m", "a");
		return super.findList(office);
	}

	/**
	 * 不过滤数据权限的，查询组织机构列表
	 */
	@Transactional(readOnly = true)
	public List<Office> findAllList(Office office) {
		return super.findList(office);
	}

	/**
	 * 查询组织列表(缓存中查询)
	 * @param isAll true：查询全部；false：查询权限范围内的组织树
	 * @return
	 */
	public List<Office> findList(Boolean isAll) {
		if (isAll != null && isAll) {
			return UserUtils.getOfficeAllList();
		} else {
			return UserUtils.getOfficeList();
		}
	}

//	/**
//	 * 查询权限范围内的组织列表
//	 * 
//	 * @deprecated findList(Boolean isAll);
//	 * @return
//	 */
//	@Deprecated
//	public List<Office> findAll() {
//		return UserUtils.getOfficeList();
//	}

	/**
	 * 保存数据（插入或更新）
	 */
	@Transactional(readOnly = false)
	public void save(Office office) {
		if (office.getIsNewRecord()){
			if (Global.isUseCorpModel()){
				office.setId(office.getCorpCode() + "_" + office.getViewCode());
			}else{
				office.setId(office.getViewCode());
			}
			if (get(office) != null){
				throw getValidationIdExistsException();
			}
		}
		super.save(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	/**
	 * 保存数据（插入或更新）
	 */
	@Transactional(readOnly = false)
	public void delete(Office office) {
		super.delete(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	/**
	 * 获取当前机构下的启用机构列表
	 * 
	 * @param office
	 * @return
	 */
	public List<Office> getEnabledList(Office office) {
		return dao.getEnabledList(office);
	}

	/**
	 * 停用当前节点
	 */
	@Transactional(readOnly = false)
	public void disable(Office office) {
		dao.disable(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	/**
	 * 停用当前节点和子节点
	 */
	@Transactional(readOnly = false)
	public void disableByGroup(Office office) {
		dao.disableByGroup(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	/**
	 * 启用当前节点
	 */
	@Transactional(readOnly = false)
	public void enable(Office office) {
		dao.enable(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	/**
	 * 启用当前节点和子节点
	 */
	@Transactional(readOnly = false)
	public void enableByGroup(Office office) {
		dao.enableByGroup(office);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_LIST);
		UserUtils.removeCache(UserUtils.CACHE_OFFICE_ALL_LIST);
	}

	public Office getByParentCode(String officeCode) {
		return dao.getByParentCode(officeCode);
	}

//	/** 
//	 * 根据公司查询获取组织机构
//	 * @author jiangwenchao
//	 * @param company
//	 * @return List<Office>  
//	 */
//	@Transactional(readOnly = true)
//	public List<Office> selectOfficesOfCompany(Company company) {
//		return dao.selectOfficesOfCompany(company);
//	}
//
//	/**
//	 * 获取组织机构
//	 */
//	public Office getOffices(Company company) {
//		String officeCodes = "";
//		String officeNames = "";
//		List<Office> list = selectOfficesOfCompany(company);
//		Office office = new Office();
//		if (list.size() > 0) {
//			for (int i = 0; i < list.size(); i++) {
//				Office o = list.get(i);
//				officeCodes = officeCodes + o.getOfficeCode() + ",";
//				officeNames = officeNames + o.getOfficeName() + ",";
//			}
//			officeCodes = officeCodes.substring(0, officeCodes.length() - 1);
//			officeNames = officeNames.substring(0, officeNames.length() - 1);
//			office.setOfficeCode(officeCodes);
//			office.setOfficeName(officeNames);
//		}
//		return office;
//	}
}
